home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 8 / QRZ Ham Radio Callsign Database - Volume 8.iso / mac / files / t_sys5 / 92052tar.gz / 920528.tar / ftp.c < prev    next >
C/C++ Source or Header  |  1991-06-04  |  3KB  |  159 lines

  1. /* @(#) $Header: ftp.c,v 1.5 91/06/04 11:33:52 deyke Exp $ */
  2.  
  3. /* Stuff common to both the FTP server and client */
  4. #include <stdio.h>
  5. #include "global.h"
  6. #include "mbuf.h"
  7. #include "netuser.h"
  8. #include "timer.h"
  9. #include "tcp.h"
  10. #include "ftp.h"
  11. #include "session.h"
  12.  
  13. /* FTP Data channel Receive upcall handler */
  14. void
  15. ftpdr(tcb,cnt)
  16. struct tcb *tcb;
  17. int cnt;
  18. {
  19.     register struct ftp *ftp;
  20.     struct mbuf *bp;
  21.     int c;
  22.  
  23.     ftp = (struct ftp *)tcb->user;
  24.     if(ftp->state != RECEIVING_STATE){
  25.         close_tcp(tcb);
  26.         return;
  27.     }
  28.     /* This will likely also generate an ACK with window rotation */
  29.     recv_tcp(tcb,&bp,cnt);
  30.  
  31. #if (defined(UNIX) || defined(MAC) || defined(AMIGA) || defined(ATARI_ST))
  32.     if(ftp->type == ASCII_TYPE){
  33.         while((c = PULLCHAR(&bp)) != -1){
  34.             if(c != '\r')
  35.                 putc(c,ftp->fp);
  36.         }
  37.         return;
  38.     }
  39. #endif
  40.     while(bp != NULLBUF){
  41.         if(bp->cnt != 0)
  42.             fwrite(bp->data,1,(unsigned)bp->cnt,ftp->fp);
  43.         bp = free_mbuf(bp);
  44.     }
  45.  
  46.     if(ftp->fp != stdout && ferror(ftp->fp)){ /* write error (dsk full?) */
  47.         fclose(ftp->fp);
  48.         ftp->fp = NULLFILE;
  49.         close_self(tcb,RESET);
  50.     }
  51. }
  52. /* FTP Data channel Transmit upcall handler */
  53. void
  54. ftpdt(tcb,cnt)
  55. struct tcb *tcb;
  56. int cnt;
  57. {
  58.     struct ftp *ftp;
  59.     struct mbuf *bp;
  60.     register char *cp;
  61.     register int c;
  62.     int eof_flag;
  63.  
  64.     ftp = (struct ftp *)tcb->user;
  65.     if(ftp->state != SENDING_STATE){
  66.         close_tcp(tcb);
  67.         return;
  68.     }
  69.     if((bp = alloc_mbuf(cnt)) == NULLBUF){
  70.         /* Hard to know what to do here */
  71.         return;
  72.     }
  73.     eof_flag = 0;
  74.     if(ftp->type == IMAGE_TYPE){
  75.         bp->cnt = fread(bp->data,1,cnt,ftp->fp);
  76.         if(bp->cnt != cnt)
  77.             eof_flag = 1;
  78.     } else {
  79.         cp = bp->data;
  80.         while(cnt > 1){
  81.             if((c = getc(ftp->fp)) == EOF){
  82.                 eof_flag=1;
  83.                 break;
  84.             }
  85. #if (defined(CPM) || defined(MSDOS))
  86.             /* ^Z is CP/M's text EOF marker, and it is sometimes used
  87.              * by MS-DOS editors too
  88.              */
  89.             if(c == CTLZ){
  90.                 eof_flag = 1;
  91.                 break;
  92.             }
  93. #endif
  94. #if (defined(UNIX) || defined(MAC) || defined(AMIGA) || defined(ATARI_ST))
  95.             if(c == '\n'){
  96.                 *cp++ = '\r';
  97.                 bp->cnt++;
  98.                 cnt--;
  99.             }
  100. #endif
  101.             *cp++ = c;
  102.             bp->cnt++;
  103.             cnt--;
  104.         }
  105.     }
  106.     if(bp->cnt != 0)
  107.         send_tcp(tcb,bp);
  108.     else
  109.         free_p(bp);
  110.  
  111.     if(eof_flag){   /* EOF seen */
  112.         if(ftp->fp != stdout)
  113.             fclose(ftp->fp);
  114.         ftp->fp = NULLFILE;
  115.         close_tcp(tcb);
  116.     }
  117. }
  118. /* Allocate an FTP control block */
  119. struct ftp *
  120. ftp_create(bufsize)
  121. unsigned bufsize;
  122. {
  123.     register struct ftp *ftp;
  124.  
  125.     if((ftp = (struct ftp *)calloc(1,sizeof (struct ftp))) == NULLFTP)
  126.         return NULLFTP;
  127.     if(bufsize != 0 && (ftp->buf = malloc(bufsize)) == NULLCHAR){
  128.         printf("called by ftp_create\n");
  129.         ftp_delete(ftp);
  130.         printf("called by ftp_create\n");
  131.         return NULLFTP;
  132.     }
  133.     ftp->state = COMMAND_STATE;
  134.     ftp->type = ASCII_TYPE; /* Default transfer type */
  135.     return ftp;
  136. }
  137. /* Free resources, delete control block */
  138. void
  139. ftp_delete(ftp)
  140. register struct ftp *ftp;
  141. {
  142.     if(ftp->fp != NULLFILE && ftp->fp != stdout)
  143.         fclose(ftp->fp);
  144.     if(ftp->data != NULLTCB)
  145.         del_tcp(ftp->data);
  146.     if(ftp->username != NULLCHAR)
  147.         free(ftp->username);
  148.     if(ftp->path != NULLCHAR)
  149.         free(ftp->path);
  150.     if(ftp->buf != NULLCHAR)
  151.         free(ftp->buf);
  152.     if(ftp->cd != NULLCHAR)
  153.         free(ftp->cd);
  154.     if(ftp->session != NULLSESSION)
  155.         freesession(ftp->session);
  156.     free((char *)ftp);
  157. }
  158.  
  159.